#include "thread.hpp"
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include<iostream>
#include <iterator>
#include <memory>
#include <ostream>
#include<string>
#include<cstring>
#include <strings.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<netinet/in.h>

using namespace std;

// uint16_t serverport=0;
// string serverip;
// int main(int argc,char* argv[])
// {
//     if(argc!=2){
//         exit(1);
//     }
//     int sock=socket(AF_INET,SOCK_DGRAM,0);
//     if(sock < 0)
//     {
//         cout<<"socket() failed"<<endl;
//         exit(2);
//     }
//     serverport=atoi(argv[2]);
//     unique_ptr<Thread> sender(new Thread(1,udpSend,(void*)&sock));
//     unique_ptr<Thread> recver(new Thread(2,udpRecv,(void*)&sock));
//     sender->start();
//     recver->start();
//     sender->join();
//     recver->join();
//     close(sock);
//     return 0;
// }
// uint16_t serverport=0;
// string serverip;
// static void* udpSend(void* args)
// {
//     int sock=*(int*)((ThreadData*)args)->_args;
//     string name=((ThreadData*)args)->_name;
//     string buffer;
//     struct sockaddr_in server;
//     bzero(&server, sizeof(server));
//     server.sin_family=AF_INET;
//     server.sin_port=htons(serverport);
//     server.sin_addr.s_addr=inet_addr(serverip.c_str());
//     while(true)
//     {
//         cerr<<"情输入您的信息"<<endl;
//         getline(cin,buffer);
//         if(buffer=="quit"){
//             break;
//         }
//         sendto(sock,buffer.c_str(),sizeof(buffer),0,(struct sockaddr*)&server,sizeof(server));
//     }
//     return nullptr;
// }
// static void* udpRecv(void* args)
// {
//     int sock=*(int*)((ThreadData*)args)->_args;
//     string name=((ThreadData*)args)->_name;
//     char buffer[1024];
//     while(true)
//     {
//         struct sockaddr_in temp;
//         socklen_t len=sizeof(temp);
//         ssize_t s=recvfrom(sock,buffer,sizeof(buffer),0,(struct sockaddr*)&temp,&len);
//         if(s > 0)
//         {
//             buffer[s]=0;
//             cout<<buffer<<endl;
//         }
//     }
//     return nullptr;
// }
// int main(int argc,char* argv[])
// {
//     if(argc!=2){
//         exit(1);
//     }
//     int sock=socket(AF_INET,SOCK_DGRAM,0);
//     if(sock < 0)
//     {
//         cout<<"socket() failed"<<endl;
//         exit(1);
//     }
//     serverport=atoi(argv[2]);
//     unique_ptr<Thread>sender(new Thread(1,udpSend,(void*)&sock));
//     unique_ptr<Thread>recver(new Thread(1,udpRecv,(void*)&sock));
//     sender->start();
//     recver->start();
//     sender->join();
//     recver->join();
//     close(sock);
//     return 0;
// }

// uint16_t serverport=0;
// std::string serverip;
// //这里从键盘读取信息然后发送至服务端
// static void* udpSend4(void* args)
// {
//     int sock=*(int*)((ThreadData*)args)->_args;
//     std::string name=((ThreadData*)args)->_name;
//     std::string buffer;
//     struct sockaddr_in server;
//     bzero(&server,sizeof(server));
//     server.sin_family=AF_INET;
//     server.sin_port=htons(serverport);
//     server.sin_addr.s_addr=inet_addr(serverip.c_str());
//     while(true)
//     {
//         std::cerr<<"请输入您的信息"<<std::endl;
//         std::getline(std::cin,buffer);
//         if(buffer=="quit")
//         {
//             break;
//         }
//         sendto(sock,buffer.c_str(),sizeof(buffer),0,(struct sockaddr*)&server,sizeof(buffer));
//     }
// }
// static void* udpSend3(void* args)
// {
//     int sock=*(int*)((ThreadData*)args)->_args;
//     std::string name=((ThreadData*)args)->_name;
//     struct sockaddr_in server;
//     bzero(&server,sizeof(server));
//     server.sin_family=AF_INET;
//     server.sin_port=htons(serverport);
//     server.sin_addr.s_addr=inet_addr(serverip.c_str());
//     while(true)
//     {
//         std::string buffer;
//         std::cerr<<"请输入您的信息"<<std::endl;
//         std::getline(std::cin,buffer);
//         if(buffer=="quit"){
//             break;
//         }
//         sendto(sock,buffer.c_str(),sizeof(buffer),0,(struct sockaddr*)&server,sizeof(server));
//     }
//     return nullptr;
// }
// static void* udpSend2(void* args)
// {
//     int sock=*(int*)((ThreadData*)args)->_args;
//     std::string name=((ThreadData*)args)->_name;
//     std::string message;
//     struct sockaddr_in server;
//     bzero(&server,sizeof(server));
//     server.sin_family=AF_INET;
//     server.sin_port=htons(serverport);
//     server.sin_addr.s_addr=inet_addr(serverip.c_str());

//     while(true)
//     {
//         //发送信息就是从键盘读入然后发送给服务端
//         std::cerr<<"请输入您的信息"<<std::endl;
//         std::getline(std::cin,message);
//         if(message=="quit"){
//             break;
//         }
//         sendto(sock,message.c_str(),message.size(),0,(struct sockaddr*)&server,sizeof(server));
//     }
//     return nullptr;
// }
// static void* udpSend(void* args)
// {
//     int sock=*(int*)((ThreadData*)args)->_args;
//     std::string name=((ThreadData*)args)->_name;
//     std::string message;
//     struct sockaddr_in server;
//     memset(&server,0,sizeof(server));
//     server.sin_family=AF_INET;
//     server.sin_port=htons(serverport);
//     server.sin_addr.s_addr=inet_addr(serverip.c_str());
//     while(true){
//         std::cerr<<"请输入您的信息"<<std::endl;
//         getline(std::cin,message);
//         if(message=="quit"){
//             break;
//         }
//         sendto(sock,message.c_str(),message.size(),0,(struct sockaddr*)&server,sizeof(server));
//     }
//     return nullptr;
// }
// static void* udpRecv2(void* args)
// {
//     int sock=*(int*)((ThreadData*)args)->_args;
//     std::string name=((ThreadData*)args)->_name;
//     char buffer[1024];
//     while(true)
//     {
//         struct sockaddr_in temp;
//         socklen_t len=sizeof(temp);
//         ssize_t s=recvfrom(sock,buffer,sizeof(buffer),0,(struct sockaddr*)&temp,&len);
//         if(s > 0)
//         {
//             buffer[s]=0;
//             std::cout<<buffer<<std::endl;
//         }
//     }
//     return nullptr;
// }
// static void* udpRecv(void* args)
// {
//     int sock=*(int*)((ThreadData*)args)->_args;
//     std::string name=((ThreadData*)args)->_name;
//     char buffer[1024];
//     while(true)
//     {
//         memset(buffer,0,sizeof(buffer));
//         struct sockaddr_in temp;
//         socklen_t len=sizeof(temp);
//         ssize_t s=recvfrom(sock,buffer,sizeof(buffer),0,(struct sockaddr*)&temp,&len);
//         if(s > 0)
//         {
//             buffer[s]=0;
//             std::cout<<buffer<<std::endl;
//         }
//     }
// }

// int main(int argc,char* argv[])
// {
//     if(argc!=3){
//         exit(1);
//     }
//     int sock=socket(AF_INET,SOCK_DGRAM,0);
//     if(sock < 0)
//     {
//         std::cout<<"socket() failed"<<std::basic_ios<typename CharT>endl;
//         exit(2);
//     }
//     //通过主线程将服务端的套接字拿到手
//     serverport=atoi(argv[2]);
//     serverip=argv[1];

//     std::unique_ptr<Thread>sender(new Thread(1,udpSend,(void*)&sock));
//     std::unique_ptr<Thread>recver(new Thread(1,udpRecv,(void*)&sock));
//     sender->start();
//     recver->start();
//     sender->join();
//     recver->join();
//     close(sock);
//     return 0;
// }